#include <iostream>
#include <vector>

#include "../logger/Logger.h"

using namespace std;

// 二分查找函数
// 参数：已排序的向量、目标值
// 返回：目标值在向量中的索引，若未找到返回-1
int binarySearch(const std::vector<int>& arr, int target) {
    int left = 0;                  // 左边界索引
    int right = arr.size() - 1;    // 右边界索引

    int i = 1;
    // 当左边界小于等于右边界时继续查找
    while (left <= right) {
        LOG_INFO("第{}次找目标{}", i++, target);

        // 计算中间索引，避免溢出
        int mid = left + (right - left) / 2;

        // 找到目标值，返回索引
        if (arr[mid] == target) {
            return mid;
        }
        // 目标值在右半部分
        else if (arr[mid] < target) {
            left = mid + 1;
        }
        // 目标值在左半部分
        else {
            right = mid - 1;
        }
    }

    // 未找到目标值
    return -1;
}

void logger_init()
{
    // 配置日志系统
    LoggerConfig config;
    config.baseFileName = "./log/unique_ptr_log";
    config.maxFileSize = 1024 * 1024; // 1MB
    config.maxFiles = 3;
    config.consoleOutput = true;
    config.level = spdlog::level::debug;

    // 初始化日志
    Logger::init(config);

    LOG_INFO("我是王乾");
}

int main()
{
    system("chcp 65001");

    logger_init();

    // 示例：已排序的数组

    std::vector<int> sortedArray;
    sortedArray.reserve(1000);
    for (int i = 0; i < 1000; i++) {
        sortedArray.emplace_back(i);
    }

    int target = 505;

    // 执行二分查找
    int result = binarySearch(sortedArray, target);

    // 输出结果
    if (result != -1) {
        std::cout << "元素 " << target << " 找到，索引为: " << result << std::endl;
    } else {
        std::cout << "元素 " << target << " 未在数组中找到" << std::endl;
    }

    return 0;
}

